package sortieren;

import java.awt.*;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import javax.swing.JPanel;

public class StabDemonstrator extends JPanel implements Demonstrator{
  protected ArrayList<Color> farben;
  protected int[] stabci;
  protected int[] schattenci;
  protected int[] zahlen;
  protected String result;

  public StabDemonstrator(Color[] cs){
    setOpaque(false);
    farben=new ArrayList<Color>();
    farben.addAll(Arrays.asList(cs));
    result="";
    setPreferredSize(new Dimension(400, 150));
  }

  public StabDemonstrator(){
    this(new Color[]{//null=Background (wird in initAction gesetzt)
      null, Color.BLACK, Color.WHITE, Color.BLUE, Color.RED, Color.GREEN,
      Color.PINK, Color.YELLOW, Color.ORANGE, Color.MAGENTA
    });
  }

  @Override
  public void initAction(GetSwapSorter alg){
    Random z=GetSwapSorter.zufall;
    while(farben.size()<=alg.marktypes())//wenn die Anzahl der Farben nicht reicht
      farben.add(new Color(z.nextFloat(), z.nextFloat(), z.nextFloat()));
    int n=alg.length();
    zahlen=new int[n];
    for(int i=zahlen.length-1; i>=0; i--) zahlen[i]=alg.uncountedGet(i);
    stabci=new int[n];
    for(int i=0; i<n; i++) stabci[i]=1;//erste Nicht-Hintergrundfarbe
    schattenci=new int[n];//0=Hintergrundfarbe
    farben.set(0, getBackground());
    result=alg.name+" noch nicht sortiert";
    repaint();
  }

  @Override
  public void markAction(GetSwapSorter alg, int i, int wie){
    if(wie>alg.marktypes()) wie=0;
    schattenci[i]=wie;
    repaint();
  }

  private int merka=0, merkb=0;
  @Override
  public void getAction(GetSwapSorter alg, int i){
    stabci[merka]=stabci[merkb]=1;
    stabci[i]=farben.size()-1;
    merka=i;
    repaint();
  }

  @Override
  public void swapAction(GetSwapSorter alg, int i, int j){
    stabci[merka]=stabci[merkb]=1;
    merka=i; merkb=j;
    stabci[i]=stabci[j]=farben.size()-2;
    zahlen[i]=alg.uncountedGet(i);
    zahlen[j]=alg.uncountedGet(j);
    repaint();
  }

  @Override
  public void readyAction(GetSwapSorter alg){
    stabci[merka]=stabci[merkb]=1;
    result=(alg.uncountedCheck()?"S":"Uns")+"ortiert mit "
          +alg.countedGets()+" Zugriffen und "+alg.countedSwaps()+" Vertauschungen.";
    repaint();
  }

  private static final int dick=5;
  private final Line2D.Double line=new Line2D.Double();
  private final Stroke back=new BasicStroke(dick);
  private final Stroke pen =new BasicStroke(dick-2);
  @Override
  public void paint(Graphics g){
    java.awt.Graphics2D g2=(Graphics2D)g;
    g2.setStroke(pen);
    int w=getWidth();
    int h=getHeight();
    if(zahlen==null) return;
    for(int i=zahlen.length; --i>=0;){
      line.x1=line.x2=dick/2+dick*i;
      line.y2=h;
      g2.setColor(farben.get(schattenci[i]));
      g2.setStroke(back);
      g2.draw(line);
      line.y2=zahlen[i];
      g2.setColor(farben.get(stabci[i]));
      g2.setStroke(pen);
      g2.draw(line);
    }
    g2.setColor(Color.BLACK);
    g2.drawString(result, 0, h-5);
  }
}
